﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Model;
using Model.Models;
using Persistence;
namespace Services
{
    /// <summary>
    /// Gerencia todas as regras de negócio da entidade Ingrediente
    /// </summary>
    public class GerenciadorIngrediente
    {
        private IUnitOfWork unitOfWork;
        private bool shared;

        public GerenciadorIngrediente()
        {
            this.unitOfWork = new UnitOfWork();
            shared = false;
        }

        internal GerenciadorIngrediente(IUnitOfWork unitOfword)
        {
            this.unitOfWork = unitOfword;
            shared = true;
        }

        public int Inserir(Ingrediente ingredienteModel)
        {
            TB_INGREDIENTE ingredienteE = new TB_INGREDIENTE();
            Atribuir(ingredienteModel, ingredienteE);
            unitOfWork.RepositorioIngrediente.Inserir(ingredienteE);
            unitOfWork.Commit(shared);
            return ingredienteE.id_Ingrediente;

        }


        public void Editar(Ingrediente ingredienteModel)
        {
            TB_INGREDIENTE ingredienteE = new TB_INGREDIENTE();
            Atribuir(ingredienteModel, ingredienteE);
            unitOfWork.RepositorioIngrediente.Editar(ingredienteE);
            unitOfWork.Commit(shared);
        }

        public void Remover(int idIngrediente)
        {
            unitOfWork.RepositorioIngrediente.Remover(ingrediente => ingrediente.id_Ingrediente.Equals(idIngrediente));
            unitOfWork.Commit(shared);

        }

        private IQueryable<Ingrediente> GetQuery()
        {
            IQueryable<TB_INGREDIENTE> tb_ingrediente = unitOfWork.RepositorioIngrediente.GetQueryable();
            var query = from ingrediente in tb_ingrediente
                        select new Ingrediente
                        {
                            Id_Ingrediente = ingrediente.id_Ingrediente,
                            Id_Empresa = ingrediente.id_Empresa,
                            Descricao = ingrediente.descricao,
                            Cod_ingrediente =  ingrediente.cod_ingrediente,
                            NomeEmpresa = ingrediente.TB_EMPRESA.nome
                            
                        };
            return query;
        }

        public IEnumerable<Ingrediente> ObterTodos()
        {
            return GetQuery();
        }

        public Ingrediente Obter(int idIngrediente)
        {
            IEnumerable<Ingrediente> ingredienteEs = GetQuery().Where(ingredienteModel => ingredienteModel.Id_Ingrediente.Equals(idIngrediente));
            return ingredienteEs.ElementAtOrDefault(0);
        }


        private void Atribuir(Ingrediente ingredienteModel, TB_INGREDIENTE ingredienteE)
        {
            ingredienteE.id_Ingrediente = ingredienteModel.Id_Ingrediente;
            ingredienteE.id_Empresa = ingredienteModel.Id_Empresa;
            ingredienteE.descricao = ingredienteModel.Descricao;
            ingredienteE.cod_ingrediente = ingredienteModel.Cod_ingrediente;
        }
    }
}